/**************************************************************************** 
 * Meta，一个轻量级的静态分区Hypervisor 
 *
 * 版权(c) , 2022-
 *
 * 作者:
 *      Tupelo Shen <shenwanjiang2013@163.com>
 *
 * Meta是一个自由软件，你可以在遵循GNU GPLv2协议的条件下，重新修改并发布它。
 *
 ***************************************************************************/
#ifndef __ARCH_VM_H__
#define __ARCH_VM_H__

#include <meta.h>           /* C 通用类型定义 */
#include <arch/vgic.h>      /* */
#include <arch/psci.h>

struct vm_arch {
    struct vgicd    vgicd;
    vaddr_t         vgicr_addr;
};
/*
 * 表示虚拟核中与架构相关的数据结构
 *      1. 多核处理器ID寄存器（VM中的guest OS需要读取此寄存器识别虚拟核）
 *      2. 虚拟中断控制器vgic私有数据结构
 *      3. 上下文切换时的内容
 */
struct vcpu_arch {
    unsigned long       vmpidr;
    struct vgic_priv    vgic_priv;
    struct psci_ctx     psci_ctx;
};

struct arch_regs {
    uint64_t x[31];
    uint64_t elr_el2;
    uint64_t spsr_el2;
} __attribute__((aligned(16)));  // makes size always aligned to 16 to respect
                                 // stack alignment

struct vcpu* vm_get_vcpu_by_mpidr(struct vm* vm, unsigned long mpidr);
void vcpu_arch_entry();

#endif /* __ARCH_VM_H__ */